package gm;

import gm.client.Client;
import gm.editor.Editor;
import gm.editor.MyMetalTheme;
import gm.server.Machine;
import gm.server.RealMachine;
import gm.server.real.RealServer;
import gm.server.virtual.VirtualServer;
import java.awt.Color;
import java.util.Arrays;
import javax.swing.JFrame;
import javax.swing.UIManager;

/**
 * Gobelinkészítő vezérlőjének alaposztálya.
 *
 * @author imruf84
 */
public class GM {

    /**
     * Program belépési pontja.
     *
     * @param args argumentumok
     */
    public static void main(String[] args) {

        int port = 8686;

        boolean runAny = false;
        boolean runServer = Arrays.asList(args).contains("server");
        boolean runVServer = Arrays.asList(args).contains("vserver");
        boolean runEditor = Arrays.asList(args).contains("editor");

        boolean guiNeeded = runVServer || runEditor;

        // GUI előkészületek.
        if (guiNeeded) {
            setLookAndFeel();
        }

        // Szerver indítása.
        if (runServer || runVServer) {

            runAny = true;

            // Gép alapparaméterei.
            double thRodsDistance = 400;
            double thRodsLength = 900;
            double thRodsDiameter = 5;
            double thRodPitch = 1;
            double armsLength = 400;
            double rpm = 14;
            double spr = 512;
            double headDistance = 40;
            double nutDistance = armsLength * 1.08d;
            //Machine machine = new Machine(thRodsDistance, thRodsLength, thRodsDiameter, thRodPitch, rpm, spr, armsLength, headDistance, nutDistance, "./machine_config");
            Machine machine = runVServer ? new Machine("./machine_config") : new RealMachine("./machine_config");

            Thread server = (runVServer ? new VirtualServer(port, machine) : new RealServer(port, machine));
            server.start();
        }

        // Kliens indítása.
        if (Arrays.asList(args).contains("client")) {
            runAny = true;
            Client client = new Client(port);
            client.run();
        }

        // Szerkesztő indítása.
        if (runEditor) {
            runAny = true;
            Editor editor = new Editor();
        }

        // Ha semmit sem futtatunk, akkor kiírjuk a kapcsolókat.
        if (!runAny) {
            System.out.println("Usage:");
            System.out.println(" client:  Runs a client.");
            System.out.println(" server:  Runs a real server on real hardware.");
            System.out.println(" vserver: Runs a virtual server with a virtual hardware simulator.");
            System.out.println(" editor:  Runs the editor.");
        }
    }

    /**
     * Saját téma alkalmazása.
     */
    public static void setLookAndFeel() {
        // Téma beállítása.
        javax.swing.plaf.metal.MetalLookAndFeel.setCurrentTheme(new MyMetalTheme());
        // Az ablakkeret az operációs rendszeré szeretnénk, hogy legyen.
        JFrame.setDefaultLookAndFeelDecorated(false);
        // Egyes témák esetében az alapértelmezett Enter leütés nem csinál semmit, ezért engedélyezzük külön.
        UIManager.getLookAndFeelDefaults().put("Button.defaultButtonFollowsFocus", Boolean.TRUE);
        // Görgetősávok témájának megváltoztatása sajátra, mert a lila szerintem túl gagyi.
        UIManager.getLookAndFeelDefaults().put("ScrollBarUI", "gm.editor.SimpleScrollBarUI");
        // Folyamatjelző felirata legyen fekete.
        UIManager.put("ProgressBar.selectionForeground", Color.BLACK);
        UIManager.put("ProgressBar.selectionBackground", Color.BLACK);
    }

    /**
     * Eltellt idő formázott kiírása.
     *
     * @param ms eltellt idő
     * @return formázott szöveg
     */
    public static String GetFormattedInterval(final long ms) {
        long millis = ms % 1000;
        long x = ms / 1000;
        long seconds = x % 60;
        x /= 60;
        long minutes = x % 60;
        x /= 60;
        long hours = x % 24;

        return String.format("%02dh:%02dm:%02ds.%03dms", hours, minutes, seconds, millis);
    }

}
